package com.woniuxy.carlife.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.carlife.domain.Coupon;
import com.woniuxy.carlife.domain.UserCoupon;
import com.woniuxy.carlife.mapper.UserCouponMapper;
import com.woniuxy.carlife.param.UserIdAndCouponId;
import com.woniuxy.carlife.service.CouponService;
import com.woniuxy.carlife.service.UserCouponService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author fx
 * @ClassName:ServiceRoyaltyServiceImpl
 * @Description: 用户拥有优惠券service实现类
 * @date 2021/4/12 17:00
 **/
@Service
public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService {

    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private UserCouponMapper mapper;

    @Resource
    private CouponService couponService;

    /**
     * 功能描述〈用户添加优惠券〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/12 17:46
     * @throws
     */
    @Override
    public Boolean saveUserCoupon(UserCoupon userCoupon) throws Exception {
        //调用领取优惠券的接口
        boolean b = couponService.updateCouponNumByCouponIdFromRedis
                (userCoupon.getCouponId());
        if (b){
            return false;
        }else{
            UserCoupon uc = new UserCoupon();
            //用户id
            uc.setUserId(userCoupon.getUserId());
            //优惠券id
            uc.setCouponId(userCoupon.getCouponId());
            //状态，默认未使用
            uc.setCouponStatus("未使用");
            //创建时间
            uc.setUserCouponCreateTime(new Timestamp(new Date().getTime()));
            int insert = mapper.insert(uc);
            if (insert>0){
                return true;
            }
        }
        return false;
    }

    /**
     * 功能描述〈用户查看已拥有优惠券〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/12 17:47
     * @throws
     */
    @Override
    public List<Coupon> findUserCouponByUserId(Integer userId) {
        //从redis查
        List<String> values = redisTemplate.opsForHash()
                .values("com.woniuxy:carlife:serviceproject:userid:" + userId);
        //创建个优惠券集合
        ArrayList<Coupon> coupon = new ArrayList<>();
        if (ObjectUtils.isEmpty(values)){
            //从数据库查
            List<UserCoupon> userCoupons = mapper.selectList(
                    new QueryWrapper<UserCoupon>()
                    .eq("user_id", userId));
            for (UserCoupon userCoupon : userCoupons) {
                //根据每个优惠券id查询优惠券
                Coupon couponInfoByCouponId =
                        couponService.findCouponInfoByCouponId(userCoupon.getCouponId());
                //存redis
                //转json
                String string = JSON.toJSONString(couponInfoByCouponId);
                redisTemplate.opsForHash()
                        .put("com.woniuxy:carlife:serviceproject:userid:"+userId,
                                "coupon:id:"+userCoupon.getCouponId(),
                                string);
                //把优惠券对象存集合
                coupon.add(couponInfoByCouponId);
            }
            return coupon;
        }
        //不为空就循环遍历
        for (String value : values) {
            //json转对象
            Coupon coupon1 = JSON.parseObject(value, Coupon.class);
            //把优惠券对象存集合
            coupon.add(coupon1);
        }
        return coupon;
    }

    /**
     * 功能描述〈用户查看拥有的有效优惠券〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/12 17:48
     * @throws
     */
    @Override
    public List<Coupon> findUserCouponWithStatusIsOk(Integer userId) {
        //从redis查
        List<String> values = redisTemplate.opsForHash()
                .values("com.woniuxy:carlife:serviceproject:couponok:userid:"+userId);
        //创建一个优惠券集合存有效优惠券
        ArrayList<Coupon> coupon = new ArrayList<>();
        if (ObjectUtils.isEmpty(values)){
            //从数据库查
            List<UserCoupon> userCoupons = mapper.selectList(
                    new QueryWrapper<UserCoupon>()
                            .eq("user_id", userId));
            for (UserCoupon userCoupon : userCoupons) {
                //如果状态是有效就查询信息
                if (userCoupon.equals("未使用")){
                    Coupon couponInfoByCouponId =
                            couponService.findCouponInfoByCouponId(userCoupon.getCouponId());

                    // 添加进集合
                    coupon.add(couponInfoByCouponId);
                    //存redis
                    //转json，还是存的优惠券对象
                    String string = JSON.toJSONString(couponInfoByCouponId);
                    redisTemplate.opsForHash()
                            .put("com.woniuxy:carlife:serviceproject:couponok:userid:"+userId,
                                    "coupon:id:"+couponInfoByCouponId.getCouponId(),
                                    string);
                }
            }
            return coupon;
        }
        //不为空就循环遍历，这里都是当前用户有效的优惠券
        for (String value : values) {
            //json转对象
            Coupon coupon1 = JSON.parseObject(value, Coupon.class);
            //直接把优惠券对象存集合
            coupon.add(coupon1);
        }
        //返回优惠券集合
        return coupon;
    }

    /**
     * 功能描述〈用户使用优惠券〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/12 17:56
     * @throws
     */
    @Override
    public Boolean updateUserConponStatusByUserIdAndCouponId(UserIdAndCouponId coupon) {
        UserCoupon userCoupon = new UserCoupon();
        //用户id
        userCoupon.setUserId(coupon.getUserId());
        //优惠券id
        userCoupon.setCouponId(coupon.getCouponId());
        //状态
        userCoupon.setCouponStatus("已使用");
        //更改用户优惠券状态为已使用
        int i = mapper.update(userCoupon,
                new QueryWrapper<UserCoupon>()
                        .eq("user_id", coupon.getUserId()));
        if (i>0){
            return true;
        }
        return false;
    }

}
